package model.beans;

import java.util.ArrayList;
import java.util.List;

public class Atributo implements Comparable<Atributo> {

	private String nome;
	private int numeroSequencia;
	private char tipoAtributo;
	private int tamAtributo;
	private int precisao;
	private String descricaoTipo;
	private List<Indice> indices;
	private List<Restricao> restricoes;

	public Atributo() {
		this.setNome("");
		this.setNumeroSequencia(0);
		this.setTipoAtributo('0');
		this.setTamAtributo(0);
		this.setPrecisao(0);
		this.setDescricaoTipo("");
		this.indices = new ArrayList<Indice>();
		this.restricoes = new ArrayList<Restricao>();

	}

	public Atributo(String nome, int numeroSequencia, char tipoAtributo,
			int tamAtributo, String descricaoTipo) {
		this.nome = nome;
		this.numeroSequencia = numeroSequencia;
		this.tipoAtributo = tipoAtributo;
		this.tamAtributo = tamAtributo;
		this.descricaoTipo = descricaoTipo;
		this.restricoes = new ArrayList<Restricao>();
		this.indices = new ArrayList<Indice>();
		this.precisao = 0;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {

			return true;
		}

		if (this.getClass() != obj.getClass()) {

			return false;
		}

		Atributo outro = (Atributo) obj;

		if (this.getTipoAtributo() == outro.getTipoAtributo()
				&& this.getTamAtributo() == outro.getTamAtributo()
				&& this.getPrecisao() == outro.getPrecisao()) {

			return true;
		}
		return false;
	}

	public boolean existeChavePrimaria() {
		boolean retorno = false;
		for (Restricao restricao : restricoes) {

			if (restricao.getRestricaoTipo().equals("primary key")) {
				System.out.println("Atributo.existeChavePrimaria()");
				retorno = true;
				break;
			}

		}

		return retorno;
	}

	public boolean existeNotNull() {
		boolean retorno = false;
		for (Restricao restricao : restricoes) {

			if (restricao.getRestricaoTipo().equals("not null")) {
				retorno = true;
				break;
			}

		}

		return retorno;
	}

	public boolean existeChaveEstrangeira() {
		boolean retorno = false;
		for (Restricao restricao : restricoes) {

			if (restricao.getRestricaoTipo().equals("foreign key")) {
				retorno = true;
				break;
			}

		}
		return retorno;
	}

	public boolean permiteNulo() {
		return !(existeChaveEstrangeira() || existeChavePrimaria() || existeNotNull());
	}

	public int getPrecisao() {
		return precisao;
	}

	public void setPrecisao(int prescisao) {
		this.precisao = prescisao;
	}

	public void addRestricao(Restricao restricao) {
		this.restricoes.add(restricao);
	}

	public int getNumeroSequencia() {
		return numeroSequencia;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public void setNumeroSequencia(int numeroSequencia) {
		this.numeroSequencia = numeroSequencia;
	}

	public char getTipoAtributo() {
		return tipoAtributo;
	}

	public void setTipoAtributo(char tipoAtributo) {
		this.tipoAtributo = tipoAtributo;
	}

	public int getTamAtributo() {
		return tamAtributo;
	}

	public void setTamAtributo(int tamAtributo) {
		this.tamAtributo = tamAtributo;
	}

	public String getValor() {
		return descricaoTipo;
	}

	public String getDescricaoTipo() {
		return descricaoTipo;
	}

	public void setDescricaoTipo(String descricaoTipo) {
		this.descricaoTipo = descricaoTipo;
	}

	public List<Indice> getIndices() {
		return indices;
	}

	public void setIndices(List<Indice> indices) {
		this.indices = indices;
	}

	public List<Restricao> getRestricoes() {
		return restricoes;
	}

	public void setRestricoes(List<Restricao> restricoes) {
		this.restricoes = restricoes;
	}

	public String toString() {
		String s = "";
		s += "nome" + this.getNome() + "\n";
		s = s + "tipo: " + this.getTipoAtributo() + "\n";
		s += "quantidade: " + restricoes.size() + "\n";
		s += "tipo" + this.getTipoAtributo() + "\n";
		return s;
	}

	@Override
	public int compareTo(Atributo o) {
		int sequencia = o.getNumeroSequencia();
		int sequenciaAtual = this.getNumeroSequencia();

		if (sequenciaAtual < sequencia)
			return -1;
		else if (sequenciaAtual > sequencia)
			return 1;

		return 0;
	}
}
